package com.wgt.startx.helper;

import com.wgt.startx.annotation.Controller;
import com.wgt.startx.annotation.Service;
import com.wgt.startx.util.SmartClassUtil;

import java.util.HashSet;
import java.util.Set;

/**
 * 我们在smart.properties中定义了base_package，通过classUtil 来记载她，所以有必要提供一个ClassHelper助手类，让他分别获取应用包
 *下的所有类，所有service类、所有controller类.
 *此外我们将带有Controller和Service的注解的类所产生的对象，理解为Smart框架锁管理的Bean，
 * 所以有必要再ClassHelper 类中增加一个获取应用包名下所有Bean类的方法.
 *
 * Created by wgt on 2017/7/30.
 */
public final class ClassHelper {
    private static final Set<Class<?>> CLASS_SET ;

    static {
        String basePackage = ConfigHelper.getAppBasePackage();
        CLASS_SET = SmartClassUtil.getClassSet(basePackage);
    }

    public static Set<Class<?>> getClassSet(){
        return CLASS_SET;
    }

    /**
     * 获取包下所有注解了Service的class
     * @return
     */
    public static Set<Class<?>> getServiceClassSet(){
        Set<Class<?>> classSet = new HashSet<Class<?>>();
        for (Class clazz : CLASS_SET){
            if (clazz.isAnnotationPresent(Service.class)){
                classSet.add(clazz);
            }
        }
        return classSet;
    }

    /**
     * 获取包下所有注解了Controller的class
     * @return
     */
    public static Set<Class<?>> getControllerClassSet(){
        Set<Class<?>> classSet = new HashSet<Class<?>>();
        for (Class clazz:CLASS_SET){
            if (clazz.isAnnotationPresent(Controller.class)){
                classSet.add(clazz);
            }
        }
        return classSet;
    }

    /**
     * 获取包下所有的bean（service，controller）用于管理
     * @return
     */
    public static Set<Class<?>> getBeanSet(){
        Set<Class<?>> classSet = new HashSet<Class<?>>();
        classSet.addAll(getServiceClassSet());
        classSet.addAll(getControllerClassSet());
        return classSet;
    }
}
